<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Flow: flow::net_flow::Congestion_control_classic_data Class Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr id="projectrow">
  <td id="projectalign">
   <div id="projectname">Flow<span id="projectnumber">&#160;2.0.0</span>
   </div>
   <div id="projectbrief">Flow project: Full implementation reference.</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div id="nav-path" class="navpath">
  <ul>
<li class="navelem"><a class="el" href="namespaceflow.html">flow</a></li><li class="navelem"><a class="el" href="namespaceflow_1_1net__flow.html">net_flow</a></li><li class="navelem"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html">Congestion_control_classic_data</a></li>  </ul>
</div>
</div><!-- top -->
<div class="header">
  <div class="summary">
<a href="#pub-methods">Public Member Functions</a> &#124;
<a href="#pri-methods">Private Member Functions</a> &#124;
<a href="#pri-static-methods">Static Private Member Functions</a> &#124;
<a href="#pri-attribs">Private Attributes</a> &#124;
<a href="#pri-static-attribs">Static Private Attributes</a> &#124;
<a href="classflow_1_1net__flow_1_1Congestion__control__classic__data-members.html">List of all members</a>  </div>
  <div class="headertitle"><div class="title">flow::net_flow::Congestion_control_classic_data Class Reference</div></div>
</div><!--header-->
<div class="contents">

<p>Utility class for use by <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html" title="The abstract interface for a per-socket module that determines the socket&#39;s congestion control behavi...">Congestion_control_strategy</a> implementations that implements congestion window and slow start threshold storage and classic Reno-style "slow start" and "congestion
avoidance" algorithms.  
 <a href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#details">More...</a></p>

<p><code>#include &lt;<a class="el" href="cong__ctl__util_8hpp_source.html">cong_ctl_util.hpp</a>&gt;</code></p>
<div class="dynheader">
Inheritance diagram for flow::net_flow::Congestion_control_classic_data:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Congestion__control__classic__data__inherit__graph.svg" width="310" height="119"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
<center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
<div class="dynheader">
Collaboration diagram for flow::net_flow::Congestion_control_classic_data:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Congestion__control__classic__data__coll__graph.svg" width="1507" height="411"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
<center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-methods" name="pub-methods"></a>
Public Member Functions</h2></td></tr>
<tr class="memitem:a537fe6cb424b4e2591cc4673ed9ec8a1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#a537fe6cb424b4e2591cc4673ed9ec8a1">Congestion_control_classic_data</a> (<a class="el" href="classflow_1_1log_1_1Logger.html">log::Logger</a> *logger_ptr, <a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aef7998db71c60eeb5d1e3d1a97c14886">Peer_socket::Const_ptr</a> sock)</td></tr>
<tr class="memdesc:a537fe6cb424b4e2591cc4673ed9ec8a1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs object by setting up logging and saving a pointer to the containing <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html" title="A peer (non-server) socket operating over the Flow network protocol, with optional stream-of-bytes an...">Peer_socket</a>, setting CWND to a reasonable initial value (also known as Initial Window or IW) per classic TCP RFCs, and setting SSTHRESH to infinity (ditto).  <a href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#a537fe6cb424b4e2591cc4673ed9ec8a1">More...</a><br /></td></tr>
<tr class="separator:a537fe6cb424b4e2591cc4673ed9ec8a1"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:adbda0ed3747b1eea62f4d790c37dbe46"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#adbda0ed3747b1eea62f4d790c37dbe46">congestion_window_bytes</a> () const</td></tr>
<tr class="memdesc:adbda0ed3747b1eea62f4d790c37dbe46"><td class="mdescLeft">&#160;</td><td class="mdescRight">Return current stored CWND value in bytes.  <a href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#adbda0ed3747b1eea62f4d790c37dbe46">More...</a><br /></td></tr>
<tr class="separator:adbda0ed3747b1eea62f4d790c37dbe46"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a1ca80ab86d6289af0f3b2bf123edd627"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#a1ca80ab86d6289af0f3b2bf123edd627">slow_start_threshold_bytes</a> () const</td></tr>
<tr class="memdesc:a1ca80ab86d6289af0f3b2bf123edd627"><td class="mdescLeft">&#160;</td><td class="mdescRight">Return current stored SSTHRESH value in bytes.  <a href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#a1ca80ab86d6289af0f3b2bf123edd627">More...</a><br /></td></tr>
<tr class="separator:a1ca80ab86d6289af0f3b2bf123edd627"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:acaa476e1821e7ed1344de8c5bfc0c9a7"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#acaa476e1821e7ed1344de8c5bfc0c9a7">init_congestion_window_bytes</a> () const</td></tr>
<tr class="memdesc:acaa476e1821e7ed1344de8c5bfc0c9a7"><td class="mdescLeft">&#160;</td><td class="mdescRight">The value to which the constructor set the stored CWND value (also known as Initial Window or IW).  <a href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#acaa476e1821e7ed1344de8c5bfc0c9a7">More...</a><br /></td></tr>
<tr class="separator:acaa476e1821e7ed1344de8c5bfc0c9a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ab3e34468efdf4d9e5b29eceb1fe84665"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#ab3e34468efdf4d9e5b29eceb1fe84665">on_acks</a> (size_t bytes)</td></tr>
<tr class="memdesc:ab3e34468efdf4d9e5b29eceb1fe84665"><td class="mdescLeft">&#160;</td><td class="mdescRight">Adjusts state, including potentially CWND, based on either "congestion avoidance" or "slow
start" algorithm, given that packets with the given amount of data were just converted from In-flight to Acknowledged (i.e., were newly acknowledged).  <a href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#ab3e34468efdf4d9e5b29eceb1fe84665">More...</a><br /></td></tr>
<tr class="separator:ab3e34468efdf4d9e5b29eceb1fe84665"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a79e85a67e583b74cc414524d53650892"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#a79e85a67e583b74cc414524d53650892">on_congestion_event</a> (size_t new_slow_start_thresh_bytes, size_t new_cong_wnd_bytes)</td></tr>
<tr class="memdesc:a79e85a67e583b74cc414524d53650892"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets internally stored SSHTRESH and CWND to the given values; appropriately resets internal state so that <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#ab3e34468efdf4d9e5b29eceb1fe84665" title="Adjusts state, including potentially CWND, based on either &quot;congestion avoidance&quot; or &quot;slow start&quot; alg...">on_acks()</a> CWND accounting will continue to work properly.  <a href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#a79e85a67e583b74cc414524d53650892">More...</a><br /></td></tr>
<tr class="separator:a79e85a67e583b74cc414524d53650892"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a63316b5d9e9a27816b09bb52c464b588"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#a63316b5d9e9a27816b09bb52c464b588">on_drop_timeout</a> (size_t new_slow_start_thresh_bytes)</td></tr>
<tr class="memdesc:a63316b5d9e9a27816b09bb52c464b588"><td class="mdescLeft">&#160;</td><td class="mdescRight">Adjust state, including CWND and SSTHRESH, assuming a Drop Timeout just occurred.  <a href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#a63316b5d9e9a27816b09bb52c464b588">More...</a><br /></td></tr>
<tr class="separator:a63316b5d9e9a27816b09bb52c464b588"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:afbe0609319f117e90074e1241abbba5c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#afbe0609319f117e90074e1241abbba5c">on_idle_timeout</a> ()</td></tr>
<tr class="memdesc:afbe0609319f117e90074e1241abbba5c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Adjust state, namely CWND, assuming an Idle Timeout just occurred.  <a href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#afbe0609319f117e90074e1241abbba5c">More...</a><br /></td></tr>
<tr class="separator:afbe0609319f117e90074e1241abbba5c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="inherit_header pub_methods_classflow_1_1log_1_1Log__context"><td colspan="2" onclick="javascript:toggleInherit('pub_methods_classflow_1_1log_1_1Log__context')"><img src="closed.png" alt="-"/>&#160;Public Member Functions inherited from <a class="el" href="classflow_1_1log_1_1Log__context.html">flow::log::Log_context</a></td></tr>
<tr class="memitem:ae7100d2dd130d8f130e3e64fdb1f4fd9 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1log_1_1Log__context.html#ae7100d2dd130d8f130e3e64fdb1f4fd9">Log_context</a> (<a class="el" href="classflow_1_1log_1_1Logger.html">Logger</a> *logger=0)</td></tr>
<tr class="memdesc:ae7100d2dd130d8f130e3e64fdb1f4fd9 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs <a class="el" href="classflow_1_1log_1_1Log__context.html" title="Convenience class that simply stores a Logger and/or Component passed into a constructor; and returns...">Log_context</a> by storing the given pointer to a <a class="el" href="classflow_1_1log_1_1Logger.html" title="Interface that the user should implement, passing the implementing Logger into logging classes (Flow&#39;...">Logger</a> and a null <a class="el" href="classflow_1_1log_1_1Component.html" title="A light-weight class, each object storing a component payload encoding an enum value from enum type o...">Component</a>.  <a href="classflow_1_1log_1_1Log__context.html#ae7100d2dd130d8f130e3e64fdb1f4fd9">More...</a><br /></td></tr>
<tr class="separator:ae7100d2dd130d8f130e3e64fdb1f4fd9 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:af1ac7f30ab442c3c6aa6079335df6c9a inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memTemplParams" colspan="2">template&lt;typename Component_payload &gt; </td></tr>
<tr class="memitem:af1ac7f30ab442c3c6aa6079335df6c9a inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memTemplItemLeft" align="right" valign="top">&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classflow_1_1log_1_1Log__context.html#af1ac7f30ab442c3c6aa6079335df6c9a">Log_context</a> (<a class="el" href="classflow_1_1log_1_1Logger.html">Logger</a> *logger, Component_payload component_payload)</td></tr>
<tr class="memdesc:af1ac7f30ab442c3c6aa6079335df6c9a inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs <a class="el" href="classflow_1_1log_1_1Log__context.html" title="Convenience class that simply stores a Logger and/or Component passed into a constructor; and returns...">Log_context</a> by storing the given pointer to a <a class="el" href="classflow_1_1log_1_1Logger.html" title="Interface that the user should implement, passing the implementing Logger into logging classes (Flow&#39;...">Logger</a> and a new <a class="el" href="classflow_1_1log_1_1Component.html" title="A light-weight class, each object storing a component payload encoding an enum value from enum type o...">Component</a> storing the specified generically typed payload (an <code>enum</code> value).  <a href="classflow_1_1log_1_1Log__context.html#af1ac7f30ab442c3c6aa6079335df6c9a">More...</a><br /></td></tr>
<tr class="separator:af1ac7f30ab442c3c6aa6079335df6c9a inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5c57a7f44959a01ca9a1c948a6686cc0 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1log_1_1Log__context.html#a5c57a7f44959a01ca9a1c948a6686cc0">Log_context</a> (const <a class="el" href="classflow_1_1log_1_1Log__context.html">Log_context</a> &amp;src)</td></tr>
<tr class="memdesc:a5c57a7f44959a01ca9a1c948a6686cc0 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="mdescLeft">&#160;</td><td class="mdescRight">Copy constructor that stores equal <code>Logger*</code> and <a class="el" href="classflow_1_1log_1_1Component.html" title="A light-weight class, each object storing a component payload encoding an enum value from enum type o...">Component</a> values as the source.  <a href="classflow_1_1log_1_1Log__context.html#a5c57a7f44959a01ca9a1c948a6686cc0">More...</a><br /></td></tr>
<tr class="separator:a5c57a7f44959a01ca9a1c948a6686cc0 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a3d4e624833d96bdafa1485ffff472509 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1log_1_1Log__context.html#a3d4e624833d96bdafa1485ffff472509">Log_context</a> (<a class="el" href="classflow_1_1log_1_1Log__context.html">Log_context</a> &amp;&amp;src)</td></tr>
<tr class="memdesc:a3d4e624833d96bdafa1485ffff472509 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="mdescLeft">&#160;</td><td class="mdescRight">Move constructor that makes this equal to <code>src</code>, while the latter becomes as-if default-constructed.  <a href="classflow_1_1log_1_1Log__context.html#a3d4e624833d96bdafa1485ffff472509">More...</a><br /></td></tr>
<tr class="separator:a3d4e624833d96bdafa1485ffff472509 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5d628315d5a93908d47a281980d3113e inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classflow_1_1log_1_1Log__context.html">Log_context</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1log_1_1Log__context.html#a5d628315d5a93908d47a281980d3113e">operator=</a> (const <a class="el" href="classflow_1_1log_1_1Log__context.html">Log_context</a> &amp;src)</td></tr>
<tr class="memdesc:a5d628315d5a93908d47a281980d3113e inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="mdescLeft">&#160;</td><td class="mdescRight">Assignment operator that behaves similarly to the copy constructor.  <a href="classflow_1_1log_1_1Log__context.html#a5d628315d5a93908d47a281980d3113e">More...</a><br /></td></tr>
<tr class="separator:a5d628315d5a93908d47a281980d3113e inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aae857197aecba8606c32296bc7bec308 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classflow_1_1log_1_1Log__context.html">Log_context</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1log_1_1Log__context.html#aae857197aecba8606c32296bc7bec308">operator=</a> (<a class="el" href="classflow_1_1log_1_1Log__context.html">Log_context</a> &amp;&amp;src)</td></tr>
<tr class="memdesc:aae857197aecba8606c32296bc7bec308 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="mdescLeft">&#160;</td><td class="mdescRight">Move assignment operator that behaves similarly to the move constructor.  <a href="classflow_1_1log_1_1Log__context.html#aae857197aecba8606c32296bc7bec308">More...</a><br /></td></tr>
<tr class="separator:aae857197aecba8606c32296bc7bec308 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aa6bb8e4250586425631ef80063caf155 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1log_1_1Log__context.html#aa6bb8e4250586425631ef80063caf155">swap</a> (<a class="el" href="classflow_1_1log_1_1Log__context.html">Log_context</a> &amp;other)</td></tr>
<tr class="memdesc:aa6bb8e4250586425631ef80063caf155 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="mdescLeft">&#160;</td><td class="mdescRight">Swaps <a class="el" href="classflow_1_1log_1_1Logger.html" title="Interface that the user should implement, passing the implementing Logger into logging classes (Flow&#39;...">Logger</a> pointers and <a class="el" href="classflow_1_1log_1_1Component.html" title="A light-weight class, each object storing a component payload encoding an enum value from enum type o...">Component</a> objects held by <code>*this</code> and <code>other</code>.  <a href="classflow_1_1log_1_1Log__context.html#aa6bb8e4250586425631ef80063caf155">More...</a><br /></td></tr>
<tr class="separator:aa6bb8e4250586425631ef80063caf155 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:af4db395042b065b00398cd59845dcb4d inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classflow_1_1log_1_1Logger.html">Logger</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1log_1_1Log__context.html#af4db395042b065b00398cd59845dcb4d">get_logger</a> () const</td></tr>
<tr class="memdesc:af4db395042b065b00398cd59845dcb4d inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the stored <a class="el" href="classflow_1_1log_1_1Logger.html" title="Interface that the user should implement, passing the implementing Logger into logging classes (Flow&#39;...">Logger</a> pointer, particularly as many <code>FLOW_LOG_*()</code> macros expect.  <a href="classflow_1_1log_1_1Log__context.html#af4db395042b065b00398cd59845dcb4d">More...</a><br /></td></tr>
<tr class="separator:af4db395042b065b00398cd59845dcb4d inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a8a5fef42dc2cedf3c0d1a6e83beb2948 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="classflow_1_1log_1_1Component.html">Component</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1log_1_1Log__context.html#a8a5fef42dc2cedf3c0d1a6e83beb2948">get_log_component</a> () const</td></tr>
<tr class="memdesc:a8a5fef42dc2cedf3c0d1a6e83beb2948 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns reference to the stored <a class="el" href="classflow_1_1log_1_1Component.html" title="A light-weight class, each object storing a component payload encoding an enum value from enum type o...">Component</a> object, particularly as many <code>FLOW_LOG_*()</code> macros expect.  <a href="classflow_1_1log_1_1Log__context.html#a8a5fef42dc2cedf3c0d1a6e83beb2948">More...</a><br /></td></tr>
<tr class="separator:a8a5fef42dc2cedf3c0d1a6e83beb2948 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pri-methods" name="pri-methods"></a>
Private Member Functions</h2></td></tr>
<tr class="memitem:aecb03f208c177ec3cbce5242f19efee0"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classbool.html">bool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#aecb03f208c177ec3cbce5242f19efee0">in_slow_start</a> () const</td></tr>
<tr class="memdesc:aecb03f208c177ec3cbce5242f19efee0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Return <code>true</code> if and only if CWND &lt; SSTHRESH.  <a href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#aecb03f208c177ec3cbce5242f19efee0">More...</a><br /></td></tr>
<tr class="separator:aecb03f208c177ec3cbce5242f19efee0"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a9c6cac4d5409855f5e39f4411d787ad9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classbool.html">bool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#a9c6cac4d5409855f5e39f4411d787ad9">congestion_window_at_limit</a> () const</td></tr>
<tr class="memdesc:a9c6cac4d5409855f5e39f4411d787ad9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns <code>true</code> if and only if the stored CWND is &gt;= a certain constant maximum value.  <a href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#a9c6cac4d5409855f5e39f4411d787ad9">More...</a><br /></td></tr>
<tr class="separator:a9c6cac4d5409855f5e39f4411d787ad9"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a7b798f3211fd2214477355b95e2d10d2"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#a7b798f3211fd2214477355b95e2d10d2">clamp_congestion_window</a> ()</td></tr>
<tr class="memdesc:a7b798f3211fd2214477355b95e2d10d2"><td class="mdescLeft">&#160;</td><td class="mdescRight">If <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#a9c6cac4d5409855f5e39f4411d787ad9" title="Returns true if and only if the stored CWND is &gt;= a certain constant maximum value.">congestion_window_at_limit()</a>, sets CWND to the limit value.  <a href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#a7b798f3211fd2214477355b95e2d10d2">More...</a><br /></td></tr>
<tr class="separator:a7b798f3211fd2214477355b95e2d10d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a092ddd8d1f700b426a5f9e0184af004f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#a092ddd8d1f700b426a5f9e0184af004f">log_state</a> (const std::string &amp;context) const</td></tr>
<tr class="memdesc:a092ddd8d1f700b426a5f9e0184af004f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Logs, in a TRACE message, all internal state values.  <a href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#a092ddd8d1f700b426a5f9e0184af004f">More...</a><br /></td></tr>
<tr class="separator:a092ddd8d1f700b426a5f9e0184af004f"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a842fd11c65c3be53ce3d81a7f050f7d7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aef7998db71c60eeb5d1e3d1a97c14886">Peer_socket::Const_ptr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#a842fd11c65c3be53ce3d81a7f050f7d7">socket</a> () const</td></tr>
<tr class="memdesc:a842fd11c65c3be53ce3d81a7f050f7d7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Analogous to <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#a3e9786f9e5f170ca23135a2a815bc3f4" title="Utility for subclasses that returns a handle to the containing Peer_socket.">Congestion_control_strategy::socket()</a>.  <a href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#a842fd11c65c3be53ce3d81a7f050f7d7">More...</a><br /></td></tr>
<tr class="separator:a842fd11c65c3be53ce3d81a7f050f7d7"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pri-static-methods" name="pri-static-methods"></a>
Static Private Member Functions</h2></td></tr>
<tr class="memitem:a1468dbf1d36eff05d61657f46df8489b"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classbool.html">bool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#a1468dbf1d36eff05d61657f46df8489b">in_slow_start</a> (size_t cong_wnd_bytes, size_t slow_start_thresh_bytes)</td></tr>
<tr class="memdesc:a1468dbf1d36eff05d61657f46df8489b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Helper that returns <code>true</code> if and only if the given CWND &lt; the given SSTHRESH.  <a href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#a1468dbf1d36eff05d61657f46df8489b">More...</a><br /></td></tr>
<tr class="separator:a1468dbf1d36eff05d61657f46df8489b"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pri-attribs" name="pri-attribs"></a>
Private Attributes</h2></td></tr>
<tr class="memitem:ae8b85cd84e7e0496ad10814008fbd9fc"><td class="memItemLeft" align="right" valign="top">boost::weak_ptr&lt; Peer_socket::Const_ptr::element_type &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#ae8b85cd84e7e0496ad10814008fbd9fc">m_sock</a></td></tr>
<tr class="memdesc:ae8b85cd84e7e0496ad10814008fbd9fc"><td class="mdescLeft">&#160;</td><td class="mdescRight">Same meaning as in <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html" title="The abstract interface for a per-socket module that determines the socket&#39;s congestion control behavi...">Congestion_control_strategy</a>.  <a href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#ae8b85cd84e7e0496ad10814008fbd9fc">More...</a><br /></td></tr>
<tr class="separator:ae8b85cd84e7e0496ad10814008fbd9fc"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a2eb9570b7c5e58a732b05a19187c0fef"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#a2eb9570b7c5e58a732b05a19187c0fef">m_cong_wnd_bytes</a></td></tr>
<tr class="memdesc:a2eb9570b7c5e58a732b05a19187c0fef"><td class="mdescLeft">&#160;</td><td class="mdescRight">Current value of CWND.  <a href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#a2eb9570b7c5e58a732b05a19187c0fef">More...</a><br /></td></tr>
<tr class="separator:a2eb9570b7c5e58a732b05a19187c0fef"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a7c792d850821c8a7c711204db867089b"><td class="memItemLeft" align="right" valign="top">const size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#a7c792d850821c8a7c711204db867089b">m_init_cong_wnd_bytes</a></td></tr>
<tr class="memdesc:a7c792d850821c8a7c711204db867089b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Initial value of CWND in constructor.  <a href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#a7c792d850821c8a7c711204db867089b">More...</a><br /></td></tr>
<tr class="separator:a7c792d850821c8a7c711204db867089b"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a239c6315ca562c4e782431879f39c74d"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#a239c6315ca562c4e782431879f39c74d">m_slow_start_thresh_bytes</a></td></tr>
<tr class="memdesc:a239c6315ca562c4e782431879f39c74d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Current value of SSTRESH.  <a href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#a239c6315ca562c4e782431879f39c74d">More...</a><br /></td></tr>
<tr class="separator:a239c6315ca562c4e782431879f39c74d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a217f407429d1cf215177e3f49f86b6d6"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#a217f407429d1cf215177e3f49f86b6d6">m_acked_bytes_since_window_update</a></td></tr>
<tr class="memdesc:a217f407429d1cf215177e3f49f86b6d6"><td class="mdescLeft">&#160;</td><td class="mdescRight">While in congestion avoidance mode (<code>!in_slow_start()</code>), the # of acked bytes reported to <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#ab3e34468efdf4d9e5b29eceb1fe84665" title="Adjusts state, including potentially CWND, based on either &quot;congestion avoidance&quot; or &quot;slow start&quot; alg...">on_acks()</a> that have not yet been accounted for in a CWND increase.  <a href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#a217f407429d1cf215177e3f49f86b6d6">More...</a><br /></td></tr>
<tr class="separator:a217f407429d1cf215177e3f49f86b6d6"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pri-static-attribs" name="pri-static-attribs"></a>
Static Private Attributes</h2></td></tr>
<tr class="memitem:ad5141d276b63528195d360f537cd4882"><td class="memItemLeft" align="right" valign="top">static const size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#ad5141d276b63528195d360f537cd4882">S_MAX_SLOW_START_CWND_INCREMENT_BLOCKS</a> = std::numeric_limits&lt;size_t&gt;::max()</td></tr>
<tr class="memdesc:ad5141d276b63528195d360f537cd4882"><td class="mdescLeft">&#160;</td><td class="mdescRight">The constant that limits how much CWND can grow in slow start for a single ack group.  <a href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#ad5141d276b63528195d360f537cd4882">More...</a><br /></td></tr>
<tr class="separator:ad5141d276b63528195d360f537cd4882"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p >Utility class for use by <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html" title="The abstract interface for a per-socket module that determines the socket&#39;s congestion control behavi...">Congestion_control_strategy</a> implementations that implements congestion window and slow start threshold storage and classic Reno-style "slow start" and "congestion
avoidance" algorithms. </p>
<p >While all (most?) congestion control algorithms store a CWND value, how each one computes or stores it is entirely up to the particular implementation. Thus each <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html" title="The abstract interface for a per-socket module that determines the socket&#39;s congestion control behavi...">Congestion_control_strategy</a> subclass can just store its own CWND data member, possibly an SSTHRESH data member, and re-implement slow start and congestion avoidance as needed.</p>
<p >However, many (most?) congestion control algorithms use the classic TCP congestion control (Reno) slow start and congestion avoidance algorithms. That is, upon acknowledgment, CWND increases either linearly (if CWND &gt;= SSTRESH) or exponentially (CWND &lt; SSTHRESH); these are "congestion
avoidance" and "slow start" modes respectively. Where most (all?) Reno-based algorithms (e.g., Westwood+) differ is what they do to CWND when loss is detected; they may halve SSTHRESH and CWND or do some other thing. However, in almost all cases, at least in some situations CWND grows according to either SS or CA based on SSTHRESH. Therefore, for code reuse among the various <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html" title="The abstract interface for a per-socket module that determines the socket&#39;s congestion control behavi...">Congestion_control_strategy</a> implementations, this class stores CWND and SSTHRESH, increases the former when asked to (based on CWND vs. SSTHRESH), and sets SSTHRESH and CWND to arbitrary given values when asked to.</p>
<p >The Linux TCP implementation is kind of based on the same idea, wherein a Reno-style <code>struct</code> storing CWND, SSTHRESH, and acked-bytes-so-far values also has a pointer to a "polymorphic" <code>struct</code> corresponding to the custom congestion control implementation (e.g., a Westwood-specific <code>struct</code> storing its bandwidth estimation variables). Then when Westwood CC is enabled, its event handlers are set to Reno functions when classic SS and CA are to be performed and to Westwood functions when a Westwood-specific action is to be performed (set CWND to the bandwidth estimate * RTT-min). It's hard to put into words, but while the idea is the same, it's not really executed quite as cleanly as it could be. The Linux-equivalent implementation in our framework would be to have <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic.html" title="Classic congestion control, based on Reno (TCP RFC 5681), with congestion avoidance,...">Congestion_control_classic</a> store CWND and SSTHRESH and implement classic SS/CA as well as CWND/SSTHRESH halving, then add <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html" title="Classic congestion control but with backoff to bandwidth estimate-based pipe size.">Congestion_control_classic_with_bandwidth_est</a> deriving from this and try to alter the superclass's behavior through inheritance (CWND setting to bandwidth-based value). Instead of forcing this IS-A relationship (as Linux kind of does), it seems cleaner and more flexible to use a HAS-A relationship: <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic.html" title="Classic congestion control, based on Reno (TCP RFC 5681), with congestion avoidance,...">Congestion_control_classic</a> HAS-A <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html" title="Utility class for use by Congestion_control_strategy implementations that implements congestion windo...">Congestion_control_classic_data</a> (and reuses all of its code, and adds SSTHRESH/CWND halving on loss); <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__with__bandwidth__est.html" title="Classic congestion control but with backoff to bandwidth estimate-based pipe size.">Congestion_control_classic_with_bandwidth_est</a> HAS-A <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html" title="Utility class for use by Congestion_control_strategy implementations that implements congestion windo...">Congestion_control_classic_data</a> (and reuses all of its code, plus adds setting SSTHRESH/CWND to a bandwidth-based value).</p>
<h3>Documentation</h3>
<p >Because this class explicitly implements Reno-style CWND growth, upon which any user class must be able to rely exactly, this class is uncharacteristically white-boxy in terms of its API and API documentation. Each method documents exactly what happens to CWND and SSTHRESH; and no CWND/SSTHRESH changes are allowed except as documented.</p>
<h3>Thread safety</h3>
<p >Same as <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html" title="The abstract interface for a per-socket module that determines the socket&#39;s congestion control behavi...">Congestion_control_strategy</a>. </p>

<p class="definition">Definition at line <a class="el" href="cong__ctl__util_8hpp_source.html#l00076">76</a> of file <a class="el" href="cong__ctl__util_8hpp_source.html">cong_ctl_util.hpp</a>.</p>
</div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
<a id="a537fe6cb424b4e2591cc4673ed9ec8a1" name="a537fe6cb424b4e2591cc4673ed9ec8a1"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a537fe6cb424b4e2591cc4673ed9ec8a1">&#9670;&nbsp;</a></span>Congestion_control_classic_data()</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">flow::net_flow::Congestion_control_classic_data::Congestion_control_classic_data </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="classflow_1_1log_1_1Logger.html">log::Logger</a> *&#160;</td>
          <td class="paramname"><em>logger_ptr</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aef7998db71c60eeb5d1e3d1a97c14886">Peer_socket::Const_ptr</a>&#160;</td>
          <td class="paramname"><em>sock</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">explicit</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Constructs object by setting up logging and saving a pointer to the containing <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html" title="A peer (non-server) socket operating over the Flow network protocol, with optional stream-of-bytes an...">Peer_socket</a>, setting CWND to a reasonable initial value (also known as Initial Window or IW) per classic TCP RFCs, and setting SSTHRESH to infinity (ditto). </p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">logger_ptr</td><td>The Logger implementation to use subsequently. </td></tr>
    <tr><td class="paramname">sock</td><td>The <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html" title="A peer (non-server) socket operating over the Flow network protocol, with optional stream-of-bytes an...">Peer_socket</a>. </td></tr>
  </table>
  </dd>
</dl>

<p class="definition">Definition at line <a class="el" href="cong__ctl__util_8cpp_source.html#l00033">33</a> of file <a class="el" href="cong__ctl__util_8cpp_source.html">cong_ctl_util.cpp</a>.</p>

<p class="reference">References <a class="el" href="cong__ctl__util_8cpp_source.html#l00375">log_state()</a>.</p>
<div class="dynheader">
Here is the call graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Congestion__control__classic__data_a537fe6cb424b4e2591cc4673ed9ec8a1_cgraph.svg" width="690" height="144"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>

</div>
</div>
<h2 class="groupheader">Member Function Documentation</h2>
<a id="a7b798f3211fd2214477355b95e2d10d2" name="a7b798f3211fd2214477355b95e2d10d2"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a7b798f3211fd2214477355b95e2d10d2">&#9670;&nbsp;</a></span>clamp_congestion_window()</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">void flow::net_flow::Congestion_control_classic_data::clamp_congestion_window </td>
          <td>(</td>
          <td class="paramname"></td><td>)</td>
          <td></td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>If <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#a9c6cac4d5409855f5e39f4411d787ad9" title="Returns true if and only if the stored CWND is &gt;= a certain constant maximum value.">congestion_window_at_limit()</a>, sets CWND to the limit value. </p>

<p class="definition">Definition at line <a class="el" href="cong__ctl__util_8cpp_source.html#l00352">352</a> of file <a class="el" href="cong__ctl__util_8cpp_source.html">cong_ctl_util.cpp</a>.</p>

<p class="reference">References <a class="el" href="log_8hpp_source.html#l00227">FLOW_LOG_TRACE</a>, <a class="el" href="cong__ctl__util_8hpp_source.html#l00255">m_cong_wnd_bytes</a>, and <a class="el" href="cong__ctl__util_8cpp_source.html#l00390">socket()</a>.</p>

<p class="reference">Referenced by <a class="el" href="cong__ctl__util_8cpp_source.html#l00076">on_acks()</a>, and <a class="el" href="cong__ctl__util_8cpp_source.html#l00228">on_congestion_event()</a>.</p>
<div class="dynheader">
Here is the call graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Congestion__control__classic__data_a7b798f3211fd2214477355b95e2d10d2_cgraph.svg" width="419" height="59"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>
<div class="dynheader">
Here is the caller graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Congestion__control__classic__data_a7b798f3211fd2214477355b95e2d10d2_icgraph.svg" width="920" height="398"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>

</div>
</div>
<a id="a9c6cac4d5409855f5e39f4411d787ad9" name="a9c6cac4d5409855f5e39f4411d787ad9"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a9c6cac4d5409855f5e39f4411d787ad9">&#9670;&nbsp;</a></span>congestion_window_at_limit()</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="classbool.html">bool</a> flow::net_flow::Congestion_control_classic_data::congestion_window_at_limit </td>
          <td>(</td>
          <td class="paramname"></td><td>)</td>
          <td> const</td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Returns <code>true</code> if and only if the stored CWND is &gt;= a certain constant maximum value. </p>
<dl class="section return"><dt>Returns</dt><dd>Ditto. </dd></dl>

<p class="definition">Definition at line <a class="el" href="cong__ctl__util_8cpp_source.html#l00345">345</a> of file <a class="el" href="cong__ctl__util_8cpp_source.html">cong_ctl_util.cpp</a>.</p>

<p class="reference">References <a class="el" href="cong__ctl__util_8hpp_source.html#l00255">m_cong_wnd_bytes</a>, and <a class="el" href="cong__ctl__util_8cpp_source.html#l00390">socket()</a>.</p>

<p class="reference">Referenced by <a class="el" href="cong__ctl__util_8cpp_source.html#l00076">on_acks()</a>.</p>
<div class="dynheader">
Here is the call graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Congestion__control__classic__data_a9c6cac4d5409855f5e39f4411d787ad9_cgraph.svg" width="447" height="59"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>
<div class="dynheader">
Here is the caller graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Congestion__control__classic__data_a9c6cac4d5409855f5e39f4411d787ad9_icgraph.svg" width="702" height="120"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>

</div>
</div>
<a id="adbda0ed3747b1eea62f4d790c37dbe46" name="adbda0ed3747b1eea62f4d790c37dbe46"></a>
<h2 class="memtitle"><span class="permalink"><a href="#adbda0ed3747b1eea62f4d790c37dbe46">&#9670;&nbsp;</a></span>congestion_window_bytes()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">size_t flow::net_flow::Congestion_control_classic_data::congestion_window_bytes </td>
          <td>(</td>
          <td class="paramname"></td><td>)</td>
          <td> const</td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Return current stored CWND value in bytes. </p>
<p >This corresponds to <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#a2b9a554ac60d9fe9d6faf32433c61c86" title="Returns the maximal number of bytes (with respect to m_data field of DATA packets) that this socket s...">Congestion_control_strategy::congestion_window_bytes()</a>.</p>
<dl class="section return"><dt>Returns</dt><dd>Ditto. </dd></dl>

<p class="definition">Definition at line <a class="el" href="cong__ctl__util_8cpp_source.html#l00061">61</a> of file <a class="el" href="cong__ctl__util_8cpp_source.html">cong_ctl_util.cpp</a>.</p>

<p class="reference">References <a class="el" href="cong__ctl__util_8hpp_source.html#l00255">m_cong_wnd_bytes</a>.</p>

<p class="reference">Referenced by <a class="el" href="cong__ctl__classic_8cpp_source.html#l00033">flow::net_flow::Congestion_control_classic::congestion_window_bytes()</a>, and <a class="el" href="cong__ctl__classic__bw_8cpp_source.html#l00045">flow::net_flow::Congestion_control_classic_with_bandwidth_est::congestion_window_bytes()</a>.</p>
<div class="dynheader">
Here is the caller graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Congestion__control__classic__data_adbda0ed3747b1eea62f4d790c37dbe46_icgraph.svg" width="464" height="131"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>

</div>
</div>
<a id="aecb03f208c177ec3cbce5242f19efee0" name="aecb03f208c177ec3cbce5242f19efee0"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aecb03f208c177ec3cbce5242f19efee0">&#9670;&nbsp;</a></span>in_slow_start() <span class="overload">[1/2]</span></h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="classbool.html">bool</a> flow::net_flow::Congestion_control_classic_data::in_slow_start </td>
          <td>(</td>
          <td class="paramname"></td><td>)</td>
          <td> const</td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Return <code>true</code> if and only if CWND &lt; SSTHRESH. </p>
<dl class="section return"><dt>Returns</dt><dd>Ditto. </dd></dl>

<p class="definition">Definition at line <a class="el" href="cong__ctl__util_8cpp_source.html#l00365">365</a> of file <a class="el" href="cong__ctl__util_8cpp_source.html">cong_ctl_util.cpp</a>.</p>

<p class="reference">References <a class="el" href="cong__ctl__util_8cpp_source.html#l00365">in_slow_start()</a>, <a class="el" href="cong__ctl__util_8hpp_source.html#l00255">m_cong_wnd_bytes</a>, and <a class="el" href="cong__ctl__util_8hpp_source.html#l00261">m_slow_start_thresh_bytes</a>.</p>

<p class="reference">Referenced by <a class="el" href="cong__ctl__util_8cpp_source.html#l00365">in_slow_start()</a>, <a class="el" href="cong__ctl__util_8cpp_source.html#l00375">log_state()</a>, <a class="el" href="cong__ctl__util_8cpp_source.html#l00076">on_acks()</a>, and <a class="el" href="cong__ctl__util_8cpp_source.html#l00228">on_congestion_event()</a>.</p>
<div class="dynheader">
Here is the call graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Congestion__control__classic__data_aecb03f208c177ec3cbce5242f19efee0_cgraph.svg" width="178" height="83"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>
<div class="dynheader">
Here is the caller graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Congestion__control__classic__data_aecb03f208c177ec3cbce5242f19efee0_icgraph.svg" width="1168" height="472"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>

</div>
</div>
<a id="a1468dbf1d36eff05d61657f46df8489b" name="a1468dbf1d36eff05d61657f46df8489b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a1468dbf1d36eff05d61657f46df8489b">&#9670;&nbsp;</a></span>in_slow_start() <span class="overload">[2/2]</span></h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="classbool.html">bool</a> flow::net_flow::Congestion_control_classic_data::in_slow_start </td>
          <td>(</td>
          <td class="paramtype">size_t&#160;</td>
          <td class="paramname"><em>cong_wnd_bytes</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">size_t&#160;</td>
          <td class="paramname"><em>slow_start_thresh_bytes</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">static</span><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Helper that returns <code>true</code> if and only if the given CWND &lt; the given SSTHRESH. </p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">cong_wnd_bytes</td><td>CWND. </td></tr>
    <tr><td class="paramname">slow_start_thresh_bytes</td><td>SSTHRESH. </td></tr>
  </table>
  </dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>See above. </dd></dl>

<p class="definition">Definition at line <a class="el" href="cong__ctl__util_8cpp_source.html#l00370">370</a> of file <a class="el" href="cong__ctl__util_8cpp_source.html">cong_ctl_util.cpp</a>.</p>

</div>
</div>
<a id="acaa476e1821e7ed1344de8c5bfc0c9a7" name="acaa476e1821e7ed1344de8c5bfc0c9a7"></a>
<h2 class="memtitle"><span class="permalink"><a href="#acaa476e1821e7ed1344de8c5bfc0c9a7">&#9670;&nbsp;</a></span>init_congestion_window_bytes()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">size_t flow::net_flow::Congestion_control_classic_data::init_congestion_window_bytes </td>
          <td>(</td>
          <td class="paramname"></td><td>)</td>
          <td> const</td>
        </tr>
      </table>
</div><div class="memdoc">

<p>The value to which the constructor set the stored CWND value (also known as Initial Window or IW). </p>
<p >This is provided, because some congestion control algorithms may want to manually set CWND back to this value on events like Idle Timeout.</p>
<dl class="section return"><dt>Returns</dt><dd>See above. </dd></dl>

<p class="definition">Definition at line <a class="el" href="cong__ctl__util_8cpp_source.html#l00066">66</a> of file <a class="el" href="cong__ctl__util_8cpp_source.html">cong_ctl_util.cpp</a>.</p>

<p class="reference">References <a class="el" href="cong__ctl__util_8hpp_source.html#l00258">m_init_cong_wnd_bytes</a>.</p>

</div>
</div>
<a id="a092ddd8d1f700b426a5f9e0184af004f" name="a092ddd8d1f700b426a5f9e0184af004f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a092ddd8d1f700b426a5f9e0184af004f">&#9670;&nbsp;</a></span>log_state()</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">void flow::net_flow::Congestion_control_classic_data::log_state </td>
          <td>(</td>
          <td class="paramtype">const std::string &amp;&#160;</td>
          <td class="paramname"><em>context</em></td><td>)</td>
          <td> const</td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Logs, in a TRACE message, all internal state values. </p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">context</td><td>A brief description of where the caller is. Preferably this should be lower-case letters with dashes separating words. We add this to the log message. Example: <code>"ack-before"</code>. </td></tr>
  </table>
  </dd>
</dl>

<p class="definition">Definition at line <a class="el" href="cong__ctl__util_8cpp_source.html#l00375">375</a> of file <a class="el" href="cong__ctl__util_8cpp_source.html">cong_ctl_util.cpp</a>.</p>

<p class="reference">References <a class="el" href="log_8hpp_source.html#l00227">FLOW_LOG_TRACE</a>, <a class="el" href="cong__ctl__util_8cpp_source.html#l00365">in_slow_start()</a>, <a class="el" href="cong__ctl__util_8hpp_source.html#l00277">m_acked_bytes_since_window_update</a>, <a class="el" href="cong__ctl__util_8hpp_source.html#l00255">m_cong_wnd_bytes</a>, <a class="el" href="cong__ctl__util_8hpp_source.html#l00261">m_slow_start_thresh_bytes</a>, and <a class="el" href="cong__ctl__util_8cpp_source.html#l00390">socket()</a>.</p>

<p class="reference">Referenced by <a class="el" href="cong__ctl__util_8cpp_source.html#l00033">Congestion_control_classic_data()</a>, <a class="el" href="cong__ctl__util_8cpp_source.html#l00076">on_acks()</a>, and <a class="el" href="cong__ctl__util_8cpp_source.html#l00228">on_congestion_event()</a>.</p>
<div class="dynheader">
Here is the call graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Congestion__control__classic__data_a092ddd8d1f700b426a5f9e0184af004f_cgraph.svg" width="435" height="144"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>
<div class="dynheader">
Here is the caller graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Congestion__control__classic__data_a092ddd8d1f700b426a5f9e0184af004f_icgraph.svg" width="954" height="403"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>

</div>
</div>
<a id="ab3e34468efdf4d9e5b29eceb1fe84665" name="ab3e34468efdf4d9e5b29eceb1fe84665"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab3e34468efdf4d9e5b29eceb1fe84665">&#9670;&nbsp;</a></span>on_acks()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void flow::net_flow::Congestion_control_classic_data::on_acks </td>
          <td>(</td>
          <td class="paramtype">size_t&#160;</td>
          <td class="paramname"><em>bytes</em></td><td>)</td>
          <td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Adjusts state, including potentially CWND, based on either "congestion avoidance" or "slow
start" algorithm, given that packets with the given amount of data were just converted from In-flight to Acknowledged (i.e., were newly acknowledged). </p>
<p >CWND may change. SSTHRESH will not change.</p>
<p >Specifically: If CWND &lt; SSTHRESH, then each byte of acked data causes CWND to increase by that many bytes. If CWND &gt;= SSTHRESH, then each CWND bytes of acked data causes CWND to be increased by N * max-block-size bytes (in max-block-size-at-a-time increments), where N is configurable by socket options (N = 1 is the value mandated by RFC 5681). State is internally maintained to enable the latter to work. This is inspired by the classic TCP congestion control combined with Appropriate Byte Counting (ABC).</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">bytes</td><td>Same meaning as for Congestion_Congestion_control_strategy::on_acks(). </td></tr>
  </table>
  </dd>
</dl>

<p class="definition">Definition at line <a class="el" href="cong__ctl__util_8cpp_source.html#l00076">76</a> of file <a class="el" href="cong__ctl__util_8cpp_source.html">cong_ctl_util.cpp</a>.</p>

<p class="reference">References <a class="el" href="cong__ctl__util_8cpp_source.html#l00352">clamp_congestion_window()</a>, <a class="el" href="cong__ctl__util_8cpp_source.html#l00345">congestion_window_at_limit()</a>, <a class="el" href="log_8hpp_source.html#l00197">FLOW_LOG_INFO</a>, <a class="el" href="log_8hpp_source.html#l00227">FLOW_LOG_TRACE</a>, <a class="el" href="cong__ctl__util_8cpp_source.html#l00365">in_slow_start()</a>, <a class="el" href="cong__ctl__util_8cpp_source.html#l00375">log_state()</a>, <a class="el" href="cong__ctl__util_8hpp_source.html#l00277">m_acked_bytes_since_window_update</a>, <a class="el" href="cong__ctl__util_8hpp_source.html#l00255">m_cong_wnd_bytes</a>, <a class="el" href="cong__ctl__util_8hpp_source.html#l00247">S_MAX_SLOW_START_CWND_INCREMENT_BLOCKS</a>, and <a class="el" href="cong__ctl__util_8cpp_source.html#l00390">socket()</a>.</p>

<p class="reference">Referenced by <a class="el" href="cong__ctl__classic_8cpp_source.html#l00038">flow::net_flow::Congestion_control_classic::on_acks()</a>, and <a class="el" href="cong__ctl__classic__bw_8cpp_source.html#l00096">flow::net_flow::Congestion_control_classic_with_bandwidth_est::on_acks()</a>.</p>
<div class="dynheader">
Here is the call graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Congestion__control__classic__data_ab3e34468efdf4d9e5b29eceb1fe84665_cgraph.svg" width="684" height="272"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>
<div class="dynheader">
Here is the caller graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Congestion__control__classic__data_ab3e34468efdf4d9e5b29eceb1fe84665_icgraph.svg" width="447" height="120"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>

</div>
</div>
<a id="a79e85a67e583b74cc414524d53650892" name="a79e85a67e583b74cc414524d53650892"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a79e85a67e583b74cc414524d53650892">&#9670;&nbsp;</a></span>on_congestion_event()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void flow::net_flow::Congestion_control_classic_data::on_congestion_event </td>
          <td>(</td>
          <td class="paramtype">size_t&#160;</td>
          <td class="paramname"><em>new_slow_start_thresh_bytes</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">size_t&#160;</td>
          <td class="paramname"><em>new_cong_wnd_bytes</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Sets internally stored SSHTRESH and CWND to the given values; appropriately resets internal state so that <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#ab3e34468efdf4d9e5b29eceb1fe84665" title="Adjusts state, including potentially CWND, based on either &quot;congestion avoidance&quot; or &quot;slow start&quot; alg...">on_acks()</a> CWND accounting will continue to work properly. </p>
<p >See details inside the method if needed, but basically since the value of (CWND &lt; SSTHRESH) may be changed by this assignment, we may move from congestion avoidance to slow start. If CWND changes at all, then a new congestion avoidance session begins if one is in progress. On the other hand if neither is true, then congestion avoidance or slow start will continue undisturbed in the next <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#ab3e34468efdf4d9e5b29eceb1fe84665" title="Adjusts state, including potentially CWND, based on either &quot;congestion avoidance&quot; or &quot;slow start&quot; alg...">on_acks()</a> call.</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">new_slow_start_thresh_bytes</td><td>New value for SSHTRESH. (May be unchanged.) </td></tr>
    <tr><td class="paramname">new_cong_wnd_bytes</td><td>New value for CWND. (May be unchanged.) </td></tr>
  </table>
  </dd>
</dl>

<p class="definition">Definition at line <a class="el" href="cong__ctl__util_8cpp_source.html#l00228">228</a> of file <a class="el" href="cong__ctl__util_8cpp_source.html">cong_ctl_util.cpp</a>.</p>

<p class="reference">References <a class="el" href="cong__ctl__util_8cpp_source.html#l00352">clamp_congestion_window()</a>, <a class="el" href="cong__ctl__util_8cpp_source.html#l00365">in_slow_start()</a>, <a class="el" href="cong__ctl__util_8cpp_source.html#l00375">log_state()</a>, <a class="el" href="cong__ctl__util_8hpp_source.html#l00277">m_acked_bytes_since_window_update</a>, <a class="el" href="cong__ctl__util_8hpp_source.html#l00255">m_cong_wnd_bytes</a>, and <a class="el" href="cong__ctl__util_8hpp_source.html#l00261">m_slow_start_thresh_bytes</a>.</p>

<p class="reference">Referenced by <a class="el" href="cong__ctl__util_8cpp_source.html#l00293">on_drop_timeout()</a>, <a class="el" href="cong__ctl__util_8cpp_source.html#l00312">on_idle_timeout()</a>, <a class="el" href="cong__ctl__classic_8cpp_source.html#l00046">flow::net_flow::Congestion_control_classic::on_loss_event()</a>, and <a class="el" href="cong__ctl__classic__bw_8cpp_source.html#l00103">flow::net_flow::Congestion_control_classic_with_bandwidth_est::on_loss_event()</a>.</p>
<div class="dynheader">
Here is the call graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Congestion__control__classic__data_a79e85a67e583b74cc414524d53650892_cgraph.svg" width="650" height="166"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>
<div class="dynheader">
Here is the caller graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Congestion__control__classic__data_a79e85a67e583b74cc414524d53650892_icgraph.svg" width="671" height="336"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>

</div>
</div>
<a id="a63316b5d9e9a27816b09bb52c464b588" name="a63316b5d9e9a27816b09bb52c464b588"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a63316b5d9e9a27816b09bb52c464b588">&#9670;&nbsp;</a></span>on_drop_timeout()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void flow::net_flow::Congestion_control_classic_data::on_drop_timeout </td>
          <td>(</td>
          <td class="paramtype">size_t&#160;</td>
          <td class="paramname"><em>new_slow_start_thresh_bytes</em></td><td>)</td>
          <td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Adjust state, including CWND and SSTHRESH, assuming a Drop Timeout just occurred. </p>
<p >This is typically treated similarly in most (all?) congestion control strategies, so it is factored out into a method. (The caller can of course choose to perform additional steps before or after.) Both CWND and SSTHRESH will change.</p>
<p >Specifically: Sets CWND to a low value, since Drop Timeout indicates a major loss event and possibly major congestion; sets SSTHRESH to the given value (which is highly dependent on the caller congestion control strategy). The CWND part is taken from classic TCP congestion control.</p>
<p >Logging: logs the before/after states of the change, but caller is encouraged to explain what it is about to do (e.g., halve SSTHRESH in case of classic Reno).</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">new_slow_start_thresh_bytes</td><td>New value for SSHTRESH. (May be unchanged.) </td></tr>
  </table>
  </dd>
</dl>

<p class="definition">Definition at line <a class="el" href="cong__ctl__util_8cpp_source.html#l00293">293</a> of file <a class="el" href="cong__ctl__util_8cpp_source.html">cong_ctl_util.cpp</a>.</p>

<p class="reference">References <a class="el" href="cong__ctl__util_8cpp_source.html#l00228">on_congestion_event()</a>, and <a class="el" href="cong__ctl__util_8cpp_source.html#l00390">socket()</a>.</p>

<p class="reference">Referenced by <a class="el" href="cong__ctl__classic_8cpp_source.html#l00126">flow::net_flow::Congestion_control_classic::on_drop_timeout()</a>, and <a class="el" href="cong__ctl__classic__bw_8cpp_source.html#l00137">flow::net_flow::Congestion_control_classic_with_bandwidth_est::on_drop_timeout()</a>.</p>
<div class="dynheader">
Here is the call graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Congestion__control__classic__data_a63316b5d9e9a27816b09bb52c464b588_cgraph.svg" width="864" height="208"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>
<div class="dynheader">
Here is the caller graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Congestion__control__classic__data_a63316b5d9e9a27816b09bb52c464b588_icgraph.svg" width="424" height="131"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>

</div>
</div>
<a id="afbe0609319f117e90074e1241abbba5c" name="afbe0609319f117e90074e1241abbba5c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#afbe0609319f117e90074e1241abbba5c">&#9670;&nbsp;</a></span>on_idle_timeout()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void flow::net_flow::Congestion_control_classic_data::on_idle_timeout </td>
          <td>(</td>
          <td class="paramname"></td><td>)</td>
          <td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Adjust state, namely CWND, assuming an Idle Timeout just occurred. </p>
<p >This is typically treated similarly in most (all?) congestion control strategies, so it is factored out into a method. (The caller can of course choose to perform additional steps before or after.) CWND will change. SSTHRESH will not change.</p>
<p >Specifically: Sets CWND to a low value (the initial window), thus in effect restarting the connection (except SSTHRESH is left alone). The policy is taken from classic TCP congestion control.</p>
<p >Logs fully. </p>

<p class="definition">Definition at line <a class="el" href="cong__ctl__util_8cpp_source.html#l00312">312</a> of file <a class="el" href="cong__ctl__util_8cpp_source.html">cong_ctl_util.cpp</a>.</p>

<p class="reference">References <a class="el" href="log_8hpp_source.html#l00227">FLOW_LOG_TRACE</a>, <a class="el" href="cong__ctl__util_8hpp_source.html#l00255">m_cong_wnd_bytes</a>, <a class="el" href="cong__ctl__util_8hpp_source.html#l00258">m_init_cong_wnd_bytes</a>, <a class="el" href="cong__ctl__util_8hpp_source.html#l00261">m_slow_start_thresh_bytes</a>, <a class="el" href="cong__ctl__util_8cpp_source.html#l00228">on_congestion_event()</a>, and <a class="el" href="cong__ctl__util_8cpp_source.html#l00390">socket()</a>.</p>

<p class="reference">Referenced by <a class="el" href="cong__ctl__classic_8cpp_source.html#l00176">flow::net_flow::Congestion_control_classic::on_idle_timeout()</a>, and <a class="el" href="cong__ctl__classic__bw_8cpp_source.html#l00209">flow::net_flow::Congestion_control_classic_with_bandwidth_est::on_idle_timeout()</a>.</p>
<div class="dynheader">
Here is the call graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Congestion__control__classic__data_afbe0609319f117e90074e1241abbba5c_cgraph.svg" width="864" height="208"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>
<div class="dynheader">
Here is the caller graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Congestion__control__classic__data_afbe0609319f117e90074e1241abbba5c_icgraph.svg" width="424" height="131"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>

</div>
</div>
<a id="a1ca80ab86d6289af0f3b2bf123edd627" name="a1ca80ab86d6289af0f3b2bf123edd627"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a1ca80ab86d6289af0f3b2bf123edd627">&#9670;&nbsp;</a></span>slow_start_threshold_bytes()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">size_t flow::net_flow::Congestion_control_classic_data::slow_start_threshold_bytes </td>
          <td>(</td>
          <td class="paramname"></td><td>)</td>
          <td> const</td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Return current stored SSTHRESH value in bytes. </p>
<p >When <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#adbda0ed3747b1eea62f4d790c37dbe46" title="Return current stored CWND value in bytes.">congestion_window_bytes()</a> &gt;= this value, it grows according to congestion avoidance mode (linearly). Otherwise it grows according to slow start mode (exponentially).</p>
<dl class="section return"><dt>Returns</dt><dd>See above. Infinity is <code>"numeric_limits&lt;size_t&gt;::max()"</code>. </dd></dl>

<p class="definition">Definition at line <a class="el" href="cong__ctl__util_8cpp_source.html#l00071">71</a> of file <a class="el" href="cong__ctl__util_8cpp_source.html">cong_ctl_util.cpp</a>.</p>

<p class="reference">References <a class="el" href="cong__ctl__util_8hpp_source.html#l00261">m_slow_start_thresh_bytes</a>.</p>

</div>
</div>
<a id="a842fd11c65c3be53ce3d81a7f050f7d7" name="a842fd11c65c3be53ce3d81a7f050f7d7"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a842fd11c65c3be53ce3d81a7f050f7d7">&#9670;&nbsp;</a></span>socket()</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aef7998db71c60eeb5d1e3d1a97c14886">Peer_socket::Const_ptr</a> flow::net_flow::Congestion_control_classic_data::socket </td>
          <td>(</td>
          <td class="paramname"></td><td>)</td>
          <td> const</td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Analogous to <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html#a3e9786f9e5f170ca23135a2a815bc3f4" title="Utility for subclasses that returns a handle to the containing Peer_socket.">Congestion_control_strategy::socket()</a>. </p>
<dl class="section return"><dt>Returns</dt><dd>Ditto. </dd></dl>

<p class="definition">Definition at line <a class="el" href="cong__ctl__util_8cpp_source.html#l00390">390</a> of file <a class="el" href="cong__ctl__util_8cpp_source.html">cong_ctl_util.cpp</a>.</p>

<p class="reference">References <a class="el" href="cong__ctl__util_8hpp_source.html#l00252">m_sock</a>.</p>

<p class="reference">Referenced by <a class="el" href="cong__ctl__util_8cpp_source.html#l00352">clamp_congestion_window()</a>, <a class="el" href="cong__ctl__util_8cpp_source.html#l00345">congestion_window_at_limit()</a>, <a class="el" href="cong__ctl__util_8cpp_source.html#l00375">log_state()</a>, <a class="el" href="cong__ctl__util_8cpp_source.html#l00076">on_acks()</a>, <a class="el" href="cong__ctl__util_8cpp_source.html#l00293">on_drop_timeout()</a>, and <a class="el" href="cong__ctl__util_8cpp_source.html#l00312">on_idle_timeout()</a>.</p>
<div class="dynheader">
Here is the caller graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Congestion__control__classic__data_a842fd11c65c3be53ce3d81a7f050f7d7_icgraph.svg" width="1195" height="470"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>

</div>
</div>
<h2 class="groupheader">Member Data Documentation</h2>
<a id="a217f407429d1cf215177e3f49f86b6d6" name="a217f407429d1cf215177e3f49f86b6d6"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a217f407429d1cf215177e3f49f86b6d6">&#9670;&nbsp;</a></span>m_acked_bytes_since_window_update</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">size_t flow::net_flow::Congestion_control_classic_data::m_acked_bytes_since_window_update</td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>While in congestion avoidance mode (<code>!in_slow_start()</code>), the # of acked bytes reported to <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#ab3e34468efdf4d9e5b29eceb1fe84665" title="Adjusts state, including potentially CWND, based on either &quot;congestion avoidance&quot; or &quot;slow start&quot; alg...">on_acks()</a> that have not yet been accounted for in a CWND increase. </p>
<p >This corresponds to the <code>bytes_acked</code> variable in TCP RFC 3465-2.1. When <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#aecb03f208c177ec3cbce5242f19efee0" title="Return true if and only if CWND &lt; SSTHRESH.">in_slow_start()</a>, this value is zero and unused.</p>
<p >More formally, the congestion avoidance (CA) algorithm with Appropriate Byte Counting (ABC), as implemented here, works as follows. When CA is entered, <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#a217f407429d1cf215177e3f49f86b6d6" title="While in congestion avoidance mode (!in_slow_start()), the # of acked bytes reported to on_acks() tha...">m_acked_bytes_since_window_update</a> = 0. Then, in every <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#ab3e34468efdf4d9e5b29eceb1fe84665" title="Adjusts state, including potentially CWND, based on either &quot;congestion avoidance&quot; or &quot;slow start&quot; alg...">on_acks()</a> call, it is incremented by <code>bytes</code>. Once it exceeds CWND, CWND bytes are "converted" into a CWND increase of N * max-block-size bytes, by performing said CWND increment and subtracting the pre-increment CWND value from <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#a217f407429d1cf215177e3f49f86b6d6" title="While in congestion avoidance mode (!in_slow_start()), the # of acked bytes reported to on_acks() tha...">m_acked_bytes_since_window_update</a>. The remainder of this operation is less than CWND and is in <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#a217f407429d1cf215177e3f49f86b6d6" title="While in congestion avoidance mode (!in_slow_start()), the # of acked bytes reported to on_acks() tha...">m_acked_bytes_since_window_update</a>. The latter is then incremented in the next <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#ab3e34468efdf4d9e5b29eceb1fe84665" title="Adjusts state, including potentially CWND, based on either &quot;congestion avoidance&quot; or &quot;slow start&quot; alg...">on_acks()</a>, and so on, until CA ends (something causes <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#aecb03f208c177ec3cbce5242f19efee0" title="Return true if and only if CWND &lt; SSTHRESH.">in_slow_start()</a>). </p>

<p class="definition">Definition at line <a class="el" href="cong__ctl__util_8hpp_source.html#l00277">277</a> of file <a class="el" href="cong__ctl__util_8hpp_source.html">cong_ctl_util.hpp</a>.</p>

<p class="reference">Referenced by <a class="el" href="cong__ctl__util_8cpp_source.html#l00375">log_state()</a>, <a class="el" href="cong__ctl__util_8cpp_source.html#l00076">on_acks()</a>, and <a class="el" href="cong__ctl__util_8cpp_source.html#l00228">on_congestion_event()</a>.</p>

</div>
</div>
<a id="a2eb9570b7c5e58a732b05a19187c0fef" name="a2eb9570b7c5e58a732b05a19187c0fef"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a2eb9570b7c5e58a732b05a19187c0fef">&#9670;&nbsp;</a></span>m_cong_wnd_bytes</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">size_t flow::net_flow::Congestion_control_classic_data::m_cong_wnd_bytes</td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Current value of CWND. </p>

<p class="definition">Definition at line <a class="el" href="cong__ctl__util_8hpp_source.html#l00255">255</a> of file <a class="el" href="cong__ctl__util_8hpp_source.html">cong_ctl_util.hpp</a>.</p>

<p class="reference">Referenced by <a class="el" href="cong__ctl__util_8cpp_source.html#l00352">clamp_congestion_window()</a>, <a class="el" href="cong__ctl__util_8cpp_source.html#l00345">congestion_window_at_limit()</a>, <a class="el" href="cong__ctl__util_8cpp_source.html#l00061">congestion_window_bytes()</a>, <a class="el" href="cong__ctl__util_8cpp_source.html#l00365">in_slow_start()</a>, <a class="el" href="cong__ctl__util_8cpp_source.html#l00375">log_state()</a>, <a class="el" href="cong__ctl__util_8cpp_source.html#l00076">on_acks()</a>, <a class="el" href="cong__ctl__util_8cpp_source.html#l00228">on_congestion_event()</a>, and <a class="el" href="cong__ctl__util_8cpp_source.html#l00312">on_idle_timeout()</a>.</p>

</div>
</div>
<a id="a7c792d850821c8a7c711204db867089b" name="a7c792d850821c8a7c711204db867089b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a7c792d850821c8a7c711204db867089b">&#9670;&nbsp;</a></span>m_init_cong_wnd_bytes</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">const size_t flow::net_flow::Congestion_control_classic_data::m_init_cong_wnd_bytes</td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Initial value of CWND in constructor. </p>

<p class="definition">Definition at line <a class="el" href="cong__ctl__util_8hpp_source.html#l00258">258</a> of file <a class="el" href="cong__ctl__util_8hpp_source.html">cong_ctl_util.hpp</a>.</p>

<p class="reference">Referenced by <a class="el" href="cong__ctl__util_8cpp_source.html#l00066">init_congestion_window_bytes()</a>, and <a class="el" href="cong__ctl__util_8cpp_source.html#l00312">on_idle_timeout()</a>.</p>

</div>
</div>
<a id="a239c6315ca562c4e782431879f39c74d" name="a239c6315ca562c4e782431879f39c74d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a239c6315ca562c4e782431879f39c74d">&#9670;&nbsp;</a></span>m_slow_start_thresh_bytes</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">size_t flow::net_flow::Congestion_control_classic_data::m_slow_start_thresh_bytes</td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Current value of SSTRESH. </p>

<p class="definition">Definition at line <a class="el" href="cong__ctl__util_8hpp_source.html#l00261">261</a> of file <a class="el" href="cong__ctl__util_8hpp_source.html">cong_ctl_util.hpp</a>.</p>

<p class="reference">Referenced by <a class="el" href="cong__ctl__util_8cpp_source.html#l00365">in_slow_start()</a>, <a class="el" href="cong__ctl__util_8cpp_source.html#l00375">log_state()</a>, <a class="el" href="cong__ctl__util_8cpp_source.html#l00228">on_congestion_event()</a>, <a class="el" href="cong__ctl__util_8cpp_source.html#l00312">on_idle_timeout()</a>, and <a class="el" href="cong__ctl__util_8cpp_source.html#l00071">slow_start_threshold_bytes()</a>.</p>

</div>
</div>
<a id="ae8b85cd84e7e0496ad10814008fbd9fc" name="ae8b85cd84e7e0496ad10814008fbd9fc"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ae8b85cd84e7e0496ad10814008fbd9fc">&#9670;&nbsp;</a></span>m_sock</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">boost::weak_ptr&lt;Peer_socket::Const_ptr::element_type&gt; flow::net_flow::Congestion_control_classic_data::m_sock</td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Same meaning as in <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__strategy.html" title="The abstract interface for a per-socket module that determines the socket&#39;s congestion control behavi...">Congestion_control_strategy</a>. </p>

<p class="definition">Definition at line <a class="el" href="cong__ctl__util_8hpp_source.html#l00252">252</a> of file <a class="el" href="cong__ctl__util_8hpp_source.html">cong_ctl_util.hpp</a>.</p>

<p class="reference">Referenced by <a class="el" href="cong__ctl__util_8cpp_source.html#l00390">socket()</a>.</p>

</div>
</div>
<a id="ad5141d276b63528195d360f537cd4882" name="ad5141d276b63528195d360f537cd4882"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad5141d276b63528195d360f537cd4882">&#9670;&nbsp;</a></span>S_MAX_SLOW_START_CWND_INCREMENT_BLOCKS</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">const size_t flow::net_flow::Congestion_control_classic_data::S_MAX_SLOW_START_CWND_INCREMENT_BLOCKS = std::numeric_limits&lt;size_t&gt;::max()</td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">static</span><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>The constant that limits how much CWND can grow in slow start for a single ack group. </p>
<p >In <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#ab3e34468efdf4d9e5b29eceb1fe84665" title="Adjusts state, including potentially CWND, based on either &quot;congestion avoidance&quot; or &quot;slow start&quot; alg...">on_acks()</a>, while <a class="el" href="classflow_1_1net__flow_1_1Congestion__control__classic__data.html#aecb03f208c177ec3cbce5242f19efee0" title="Return true if and only if CWND &lt; SSTHRESH.">in_slow_start()</a>, each byte acknowledged increments CWND by 1 byte. However, if the total number of such bytes exceeds this constant, CWND only increments by this constant times max-block-size. </p>

<p class="definition">Definition at line <a class="el" href="cong__ctl__util_8hpp_source.html#l00247">247</a> of file <a class="el" href="cong__ctl__util_8hpp_source.html">cong_ctl_util.hpp</a>.</p>

<p class="reference">Referenced by <a class="el" href="cong__ctl__util_8cpp_source.html#l00076">on_acks()</a>.</p>

</div>
</div>
<hr/>The documentation for this class was generated from the following files:<ul>
<li>net_flow/detail/cong_ctl/<a class="el" href="cong__ctl__util_8hpp_source.html">cong_ctl_util.hpp</a></li>
<li>net_flow/detail/cong_ctl/<a class="el" href="cong__ctl__util_8cpp_source.html">cong_ctl_util.cpp</a></li>
</ul>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Fri Mar 28 2025 22:55:35 for Flow by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4
</small></address>
</body>
</html>
